Pythonを使って証明書から公開鍵を取り出してみる
どうも!大阪オフィスの西村祐二です。
Pythonを使って証明書から公開鍵を取り出すという場面に出くわしたので、その方法を紹介したいと思います。
今回、外部ライブラリのpyOpenSSLを使ってやっていきます。
pyOpenSSLはけっこう高機能で、Pythonにデフォルトで入っているsslのライブラリではできないようなことを簡単にできたりします。ただ、書き方など少しクセがあるようにかんじたので、備忘録もかねてブログ化しておきたいと思います。
使用する証明書
今回、使用するサンプル証明書はAWSより公開されているサーバ証明書を使いたいと思います。
下記リンク先のAWS IoTのページのRSA 2048 ビットキー: VeriSign クラス 3 Public Primary G5 ルート CA 証明書から取得することができます。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/managing-device-certs.html
ダウンロードリンクはこちらです。
この証明書をローカルに保存しておきます。
環境
- macOS High Sierra 10.13.6
- Python 3.6.0
インストール
$ pip install pyopenssl
プログラム
最終行のところのファイルパスは各々変更してください。
import OpenSSL def get_pubkey(file_path): """証明書から公開鍵を取得する.""" # 証明書をopen pem_file = open(file_path, 'rb') # byteに変換 buffer = pem_file.read() # 証明書を読み込み pemCert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, buffer) # 公開鍵を取得 pubkey = OpenSSL.crypto.dump_publickey( OpenSSL.crypto.FILETYPE_PEM, pemCert.get_pubkey()) print(pubkey) get_pubkey('/Users/nishimura.yuji/Downloads/VeriSign-Class 3-Public-Primary-Certification-Authority-G5.pem')
- OpenSSL.crypto.load_certificate
- 証明書を読み込みます。第二引数はバッファである必要があります。
- 第一引数は
OpenSSL.crypto.FILETYPE_PEM
のように、OpenSSL.crypto
をつける必要があります。 - https://pyopenssl.org/en/stable/api/crypto.html#OpenSSL.crypto.load_certificate
- OpenSSL.crypto.dump_publickey
- テキストで公開鍵を取得したいときは、このメソッド使います。
- 第二引数にはpkey型のダンプする公開鍵を指定する必要があります。
- https://pyopenssl.org/en/stable/api/crypto.html#OpenSSL.crypto.dump_publickey
実行
上記のプログラムを実行すると、下記のように出力されます。想定どおり、公開鍵の情報が出力されていることがわかります。
b'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAryQICCl6NZ5gDKrnSztO\n3Hy8PEUcuyvg/ikC+VcIo2SFFSf18a3IMYldIugqqqZCs4/4uVW3sbdLs/6PfgdX\n7O9D22ZiFWHPYA2k2N744MNiCD1UE+tJyllUhSblK48bn+v1oZHCM0nYQ2NqUkvS\nj+hwUU3RiWl7x3D2s9wSdNt7XUtW05a/FXehsPSiJfKvHJJnGOX0BgTvkLnkAOTd\nOrUZ/wK69Dzu4IvrN4vs9Nes8vbwPa/ddZEzGR0cQMt0JBkhk9kU/qwqUseP1QRJ\n5I1jR4g8aYPL/ke9K35PxZWuDp3U0UPAZ3PjFAh+5T+fc7gzCs9dPzSHloruU+gl\nFQIDAQAB\n-----END PUBLIC KEY-----\n'
さいごに
いかがだったでしょうか。
Pythonを使って証明書から公開鍵を取り出す方法を紹介しました。
今回使用したpyOpenSSLはとても高機能でできることがいっぱいあるので、今後も使い方など紹介していきたいと思います。
誰かの参考になれば幸いです。